package com.cn.por.biz.bigtable.bo.impl;
import cn.hsa.base.web.vo.PageFactory;
import cn.hsa.base.web.vo.PageResultData;
import com.cn.por.biz.bigtable.dao.BigTableDAO;
import com.cn.por.biz.bigtable.bo.BigTableBO;
import com.cn.por.biz.bigtable.entity.BigTableDO;
import com.cn.por.biz.bigtable.dto.BigTableDTO;
import com.cn.por.biz.bigtable.dto.BigTableDTOConverter;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
/**
 * <p>实现层</p>
 * @author xw
 * @since 2025-06-02
 */
@Service
public class BigTableBOImpl extends ServiceImpl<BigTableDAO, BigTableDO>  implements BigTableBO {

    @Autowired
    private BigTableDTOConverter bigTableDTOConverter; 
 
    @Autowired
    private BigTableDAO bigTableDAO;

    @Override
    public BigTableDTO add(BigTableDTO bigTableDTO){
      BigTableDO bigTableDO = toDO(bigTableDTO);
      bigTableDAO.insert(bigTableDO);
      return toDTO(bigTableDO);
    }

    @Override
    public Boolean delete(String id){
      BigTableDO bigTableDO = new BigTableDO();
      return bigTableDAO.updateById(bigTableDO)>0;
    }

    @Override
    public BigTableDTO update(BigTableDTO bigTableDTO){
      BigTableDO bigTableDO = toDO(bigTableDTO);
      bigTableDAO.updateById(bigTableDO);
      return toDTO(bigTableDO);
    }

    @Override
    public BigTableDTO get(String id){
      return toDTO(bigTableDAO.selectById(id));
    }
    /**
     * 在获取规则算法变量对应的值时，有多种情况需要考虑
     * 算法变量在取值时，先要知道值要获取哪个项目要素中的值，比如说
     * 在有合规项目和违规项目的情况下，需要取到合规项目的总数量，那么
     * 就需要保证算法变量对应的要素编码和当前规则要素编码一致，才能保证
     * 取到的是正确的值。
     */

    @Override
    public PageResultData<BigTableDTO> getPage(int pageNo, int pageSize, BigTableDTO bigTableDTO){
      Page<BigTableDO> page = PageFactory.createPage(pageNo, pageSize);
      BigTableDO bigTableDO = toDO(bigTableDTO);
      QueryWrapper<BigTableDO> queryWrapper = new QueryWrapper<BigTableDO>();
      if (!StringUtils.isEmpty(bigTableDO.getName()) ){
        queryWrapper.eq("name", bigTableDO.getName());
      }
      if (!StringUtils.isEmpty(bigTableDO.getMobile()) ){
        queryWrapper.eq("mobile", bigTableDO.getMobile());
      }
      page = bigTableDAO.selectPage(page, queryWrapper);
      // do list --> dto list
      List<BigTableDO> records = page.getRecords();
      List<BigTableDTO> list = new ArrayList<BigTableDTO>();
      for (BigTableDO row : records) {
        list.add(toDTO(row));
      }
      PageResultData<BigTableDTO> result = PageFactory.createPage(list, page);
      return result;
    }

    private BigTableDO toDO(BigTableDTO bigTableDTO){
      BigTableDO bigTableDO = bigTableDTOConverter.convertToBigTableDO(bigTableDTO);
      return bigTableDO;
    }

    private BigTableDTO toDTO(BigTableDO bigTableDO){
      BigTableDTO bigTableDTO = bigTableDTOConverter.convertToBigTableDTO(bigTableDO);
      return bigTableDTO;
    }
}